import uuid
from BloodSpiderAPI import models
from BloodSpiderModel.DjangoResponseTool.response_dict import response_dict, get_page
from BloodSpiderAPI.apis.script.category.utils import script_category_to_dict


def script_category_create(request):
    """
    创建话术分类
    请求方式: POST
    参数:
        name: 分类名称 (必填, 例如: "代练中", "撤单中")
        status: 分类状态 (必填, 1-正常, 2-禁用)
    返回:
        创建的话术分类信息
    """
    try:
        # 获取参数
        name = request.POST.get('name')
        status_str = request.POST.get('status', 1)
        # 参数验证
        if not name:
            return response_dict(code=1, message="分类名称参数错误, 不能为空")
        if not status_str:
            return response_dict(code=1, message="分类状态参数错误, 不能为空")

        try:
            status = int(status_str)
        except ValueError:
            return response_dict(code=1, message="分类状态参数错误, 必须为有效的数字")

        if status not in [1, 2]:
            return response_dict(code=1, message="分类状态参数错误, 仅支持1(正常)或2(禁用)")

        # 检查分类名称是否已存在
        if models.ScriptCategory.objects.filter(name=name).exists():
            return response_dict(code=1, message="分类名称已存在")

        # 创建分类记录
        new_category = models.ScriptCategory.objects.create(
            category_id=uuid.uuid4(),
            name=name,
            status=status,
        )

        # 构造返回数据
        return response_dict(data=script_category_to_dict(new_category), message="话术分类创建成功")
    except Exception as e:
        return response_dict(code=1, message=f"话术分类创建失败: {str(e)}")


def script_category_list(request):
    """
    获取话术分类列表
    请求方式: GET
    参数:
        status: 状态 (选填, 1-正常, 2-禁用)
        sort_by: 排序字段 (选填, 支持name/-name/create_time/-create_time, 默认:-create_time)
        page: 页码 (选填, 默认:1)
        page_size: 每页数量 (选填, 默认:10)
    返回:
        话术分类列表, 支持分页
    """
    try:
        # 获取参数
        status = int(request.GET.get('status', 1))
        sort_by = request.GET.get('sort_by', '-create_time')
        page = int(request.GET.get('page', 1))
        page_size = int(request.GET.get('page_size', 10))

        # 构建查询条件
        queryset = models.ScriptCategory.objects.all()
        if status:
            queryset = queryset.filter(status=int(status))

        # 排序
        allowed_sort_fields = ['name', '-name', 'create_time', '-create_time']
        if sort_by not in allowed_sort_fields:
            sort_by = '-create_time'
        queryset = queryset.order_by(sort_by)

     

        # 构造返回数据
        result_list = [script_category_to_dict(item) for item in queryset]

        return response_dict(data=result_list, message="话术分类列表获取成功")
    except Exception as e:
        return response_dict(code=1, message=f"话术分类列表获取失败: {str(e)}")


def script_category_detail(request):
    """
    获取话术分类详情
    请求方式: GET
    参数:
        category_id: 分类ID (必填)
    返回:
        话术分类详情信息
    """
    try:
        # 获取参数
        category_id = request.GET.get('category_id')

        # 参数验证
        if not category_id:
            return response_dict(code=1, message="分类ID参数错误, 不能为空")

        # 查询分类
        category = models.ScriptCategory.objects.filter(category_id=category_id).first()
        if not category:
            return response_dict(code=1, message="话术分类不存在")

        # 构造返回数据
        return response_dict(data=script_category_to_dict(category), message="话术分类详情获取成功")
    except Exception as e:
        return response_dict(code=1, message=f"话术分类详情获取失败: {str(e)}")


def script_category_update(request):
    """
    更新话术分类
    请求方式: POST
    参数:
        category_id: 分类ID (必填)
        name: 分类名称 (选填, 例如: "代练中", "撤单中")
        status: 分类状态 (选填, 1-正常, 2-禁用)
        update_by: 更新人 (选填, 字符串)
    返回:
        更新后的话术分类信息
    """
    try:
        # 获取参数
        category_id = request.POST.get('category_id')
        name = request.POST.get('name')
        status = request.POST.get('status')
        update_by = request.POST.get('update_by', '')

        # 参数验证
        if not category_id:
            return response_dict(code=1, message="分类ID参数错误, 不能为空")

        # 查询分类
        category = models.ScriptCategory.objects.filter(category_id=category_id).first()
        if not category:
            return response_dict(code=1, message="话术分类不存在")

        # 更新分类信息
        if name:
            # 检查分类名称是否已存在
            if models.ScriptCategory.objects.filter(name=name).exclude(category_id=category_id).exists():
                return response_dict(code=1, message="分类名称已存在")
            category.name = name
        if status:
            status = int(status)
            if status not in [1, 2]:
                return response_dict(code=1, message="分类状态参数错误, 仅支持1(正常)或2(禁用)")
            category.status = status
        if update_by:
            category.update_by = update_by

        category.save()

        # 构造返回数据
        return response_dict(data=script_category_to_dict(category), message="话术分类更新成功")
    except Exception as e:
        return response_dict(code=1, message=f"话术分类更新失败: {str(e)}")


def script_category_delete(request):
    """
    删除话术分类
    请求方式: POST
    参数:
        category_id: 分类ID (必填)
    返回:
        删除结果
    """
    try:
        # 获取参数
        category_id = request.POST.get('category_id')

        # 参数验证
        if not category_id:
            return response_dict(code=1, message="分类ID参数错误, 不能为空")

        # 查询分类
        category = models.ScriptCategory.objects.filter(category_id=category_id).first()
        if not category:
            return response_dict(code=1, message="话术分类不存在")

        # 删除分类 (物理删除, 可根据需求改为逻辑删除)
        category.delete()

        return response_dict(message="话术分类删除成功")
    except Exception as e:
        return response_dict(code=1, message=f"话术分类删除失败: {str(e)}")